let compare a b =
match a with
	a when a > b -> 1
	|a when a = b -> 0
	|_ -> -1;;
	
let rec find nom liste =
match liste with 
	[] -> invalid_arg "le client n'est pas dans la liste"
	|(e1,e2)::l -> if (String.lowercase e1) = (String.lowercase nom) then 
						e2
					else 
						find nom l;;

let rec add nom liste = 
match (nom,liste) with 
	(e1,[]) -> e1::[]
	|((a1,a2), (b1,b2)::l) -> let x = compare (String.lowercase a1) (String.lowercase b1) in match x with
										0 -> (b1,b2)::l 
										|1 -> (b1,b2)::(add (a1,a2) l)
										|_ -> (a1,a2)::(add (b1,b2) l);;

let rec delete nom liste =
match liste with
	[] -> [] 
	|(e1,e2)::l -> if String.lowercase e1 = String.lowercase nom then
						l
					else
						(e1,e2)::(delete nom l);;
						
let rec update nom montant liste =
match liste with
	[] -> []
	|(e1,e2)::l -> if String.lowercase e1 = String.lowercase nom then
						(e1,montant)::l
					else
						(e1,e2)::(update nom montant l);;

let rec name nom1 nom2 liste =
match liste with 
	[] -> []
	|(e1,e2)::l -> if String.lowercase e1 = String.lowercase nom1 then 
						(nom2,e2)::l
				    else
						(e1,e2)::(name nom1 nom2 l);;

let rec map f liste = 
match liste with
	[] -> []
	| e::l -> f e::map f l;;

let rec sales liste pourcentage = map (function (a,b) -> (a, b-.(pourcentage/.100.*.b))) liste;;

let rec fusion liste1 liste2 = 
match (liste1,liste2) with
	(l,[]) | ([],l) -> l
	| ((a1,a2)::l1,(b1,b2)::l2) -> let x = compare (String.lowercase a1) (String.lowercase b1) in match x with 
											0 -> (a1,a2+.b2)::(fusion l1 l2)
											| 1 -> (b1,b2)::(fusion ((a1,a2)::l1) l2)
											| _ -> (a1,a2)::(fusion l1 ((b1,b2)::l2));;		